﻿using System.Collections.Generic;
using StockholmsStad.Web.UI.Class.Interfaces;
using StockholmsStad.Web.UI.UIServiceReference;

namespace StockholmsStad.Web.UI.Class.Model
{
    /// <summary>
    /// MVC Model för registrering
    /// </summary>
    public class RegistrationModel : ModelBase, IRegistrationModel
    {
        private readonly IServiceFacade _facade;

        /// <summary>
        /// Skapar model med tillhörande session och servicefasad
        /// </summary>
        /// <param name="session"></param>
        /// <param name="facade"></param>
        public RegistrationModel(ISession session, IServiceFacade facade)
            : base(session, facade)
        {
            _facade = facade;
        }

        #region IRegistrationModel Members

        /// <summary>
        /// Alla tillgängliga ceremonispråk
        /// </summary>
        public IEnumerable<ValueIdPair> CeremonyLanguages
        {
            get { return _facade.CeremonyLanguages; }
        }

        /// <summary>
        /// Alla tillgängliga specialbehov
        /// </summary>
        public IEnumerable<ValueIdPair> CeremonySpecialNeeds
        {
            get { return _facade.CeremonySpecialNeeds; }
        }

        /// <summary>
        /// Alla tillgängliga vigselbevisspråk
        /// </summary>
        public IEnumerable<ValueIdPair> WeddingCertificateLanguages
        {
            get
            {
                return _facade.WeddingCertificateLanguages;
            }
        }

        /// <summary>
        /// Fullständigt namn för person1
        /// </summary>
        public string FullNameFromPerson1
        {
            get
            {
                if (Couple.Person1 != null)
                {
                    Person person1 = Couple.Person1;
                    return person1.FirstNames + " " + person1.LastName;
                }
                return "";
            }
        }


        /// <summary>
        /// Email för kontaktpersonen
        /// </summary>
        public string ContactEmail
        {
            get
            {
                ContactPerson contact = Couple.ContactPerson;
                Person person1 = Couple.Person1;
                string email = null;
                if (contact != null)
                {
                    email = contact.Email;
                }
                else if (person1 != null)
                {
                    email = person1.Email;
                }
                return email ?? "";
            }
        }

        /// <summary>
        /// Registrera nuvarade par på servern
        /// </summary>
        public void RegisterCouple(User user)
        {
            if (RegistrationTicketId == null)
            {
                RegistrationTicketId = _facade.RegisterCouple(Couple, Ceremony);
            }
            else
            {
                _facade.UpdateCouple(user, Couple, Ceremony, RegistrationTicketId.Value);
            }
        }

        ///<summary>
        /// Ser till att nyckel för registrering inte liggar kvar vid ny registrering
        ///</summary>
        public void ResetResetRegistrationTicketId()
        {
            RegistrationTicketId = null;
        }

        /// <summary>
        /// Hämtar serverinfo och lägger i sessionens Couple,
        /// Sätter även registreringens ticketId
        /// </summary>
        public void UpdateCoupleFromServer(User user)
        {
            RegistrationTicketId = _facade.GetTicketId(user);
            Couple = _facade.GetCouple(user, RegistrationTicketId.Value);
        }

        /// <summary>
        /// Hämtar serverinfo och lägger i sessionens Ceremony
        /// </summary>
        public void UpdateCeremonyFromServer(User user)
        {
            Ceremony = _facade.GetCeremony(user, RegistrationTicketId.Value);
        }

        ///<summary>
        /// Tar reda på om användarnamnet är unikt. Används om användaren är inloggad
        ///</summary>
        ///<param name="user"></param>
        ///<param name="username"></param>
        ///<returns></returns>
        public bool IsUserNameUnique(User user, string username)
        {
            if (user == null)
                return _facade.IsUserNameUnique(null, username);
            return _facade.IsUserNameUnique(user, username);
        }

        /// <summary>
        /// Returnerar true om bokningen kan uppdateras från webbapplikationen
        /// </summary>
        /// <returns></returns>
        public bool IsUpdateable()
        {
            return _facade.IsUpdateable(Booking);
        }

        #endregion
    }
}